package org.example.pingpong.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

/**
 * 配置Swagger2和Knife4j，用于生成在线API文档的配置类。
 * <p>
 * Swagger2 用于生成REST API文档，而 Knife4j 是对 Swagger2 的增强，提供更强大的功能和界面。
 */
@Configuration
@EnableSwagger2WebMvc  // 启用 Swagger2 Web MVC 支持
public class Knife4jConfig {

    // API 文档标题常量
    private static final String API_TILE = "乒乓球比赛管理系统";

    /**
     * 配置 Swagger2 的 Docket 实例，用于生成 API 文档。
     * <p>
     * Docket 是 Swagger 配置的核心，通过它可以定义 API 文档的生成方式、选择哪些 API 被包含，设置接口的基本信息等。
     *
     * @return 配置好的 Docket 实例
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)  // 指定使用 Swagger 2 类型
                .apiInfo(apiInfo())  // 配置 API 文档的基本信息
                .select()  // 启用 API 选择器
                .apis(RequestHandlerSelectors.basePackage("org.example.pingpong.controller"))  // 指定扫描哪个包下的 Controller 类，生成文档
                .paths(PathSelectors.any())  // 设置匹配路径，这里是生成所有路径的文档
                .build();  // 完成 Docket 配置
    }

    /**
     * 配置 API 文档的基本信息，包括标题、描述、版本号等。
     * 这些信息会在生成的 API 文档中展示。
     *
     * @return 配置好的 ApiInfo 实例
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title(API_TILE)  // 文档标题
                .description("乒乓球比赛管理系统在线API文档")  // 文档描述
                .version("1.0.0")  // 文档版本号
                .build();  // 完成 ApiInfo 配置
    }
}
